﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;

using System.Security.Authentication;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;

using PEMS.Common;

namespace PEMS.Server
{
    /// <summary>
    /// adatok tárolására szolgáló singleton osztály
    /// </summary>
    [Serializable]
    public sealed class Intezmeny
    {
        #region Variables

        /// <summary>
        ///  a személyek listája, akik regisztrálva vannak a PEMS-ben
        /// </summary>
        public SerializableDictionary<string, Ember> emberList { get; set; }

        /// <summary>
        ///  az intézmény tárgyainak listája
        /// </summary>
        //átkerült a Targyak-ba
        //public SerializableDictionary<string, Targy> targyList { get; set; }

        /// <summary>
        ///  az intézmény féléveinek listája
        /// </summary>
        //átkerült a Felevek-be
        //public SerializableDictionary<string, Felev> felevList { get; set; }

        /// <summary>
        ///  a szervíz által hitelesített kliensek leírásait itt tároljuk
        ///  azaz, akik sikeresen bejelentkeztek
        /// </summary>
        public SerializableDictionary<string, Auth> authenticated { get; set; }

        public static readonly Object _lock = new Object();

        private static Intezmeny _instance = null;

        //public static int counter = 0;

        #endregion

        public Emberek emberek = new Emberek();
        public Felevek felevek = new Felevek();
        public Targyak targyak = new Targyak();

        private Intezmeny()
        {
//            emberList = new SerializableDictionary<string, Ember>();

            authenticated = new SerializableDictionary<string, Auth>();

            Log.logToFile("XXXXXXXXXXX Intezmeny konstruktor XXXXXXXXXXXX", false);

            emberek.felhasznaloHozzaadasa("h1", "hallgato 1", "hh", UserTypeEnum.hallgato);
            emberek.felhasznaloHozzaadasa("h2", "hallgato 2", "hh", UserTypeEnum.hallgato);
            emberek.felhasznaloHozzaadasa("t1", "oktato 1", "tt", UserTypeEnum.oktato);
            emberek.felhasznaloHozzaadasa("a1", "admin 1", "aa", UserTypeEnum.administrator);

/*            Hallgato hallgato = new Hallgato("h1", "hallgato 1", "hh", true, UserTypeEnum.hallgato);
            emberList.Add("h1", hallgato);
            Oktato oktato = new Oktato("t1", "oktato 1", "tt", true, UserTypeEnum.oktato);
            emberList.Add("t1", oktato);
            Admin admin = new Admin("a1", "admin 1", "aa", true, UserTypeEnum.administrator);
            emberList.Add("a1", admin);*/
        } 

        #region Properties
        /// <summary>
        ///  az egyke Data legyártása (egyszer, (lock alatt)) és a példány visszaadása
        /// </summary>
        public static Intezmeny instance
        {
            get
            {
                lock (_lock)
                {
                    if (_instance == null)
                    {
                        _instance = new Intezmeny();
                    }
                }

                return _instance;
            }
        }

        #endregion

/*
        /// <summary>
        ///  Egy adott felhasználó meglétének ellenőrzése userName alapján
        /// </summary>
        public Ember getFelhasznalo(string userName)
        {
            try
            {
                if (emberList.ContainsKey(userName))
                {
                    return emberList[userName];
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("\nException in getFelhasznalo(): " + e.Message + "\n");
                return null;
            }
            return null;            
        }
        

        /// <summary>
        ///  Felhasználói lista lekérdezése
        /// </summary>
        public List<Ember> getFelhasznalok()
        {
            List<Ember> felhasznalok = new List<Ember>();
            foreach (KeyValuePair<string, Ember> e in Intezmeny.instance.emberList)
            {
                felhasznalok.Add(e.Value);
            }
            return felhasznalok;
        }

        /// <summary>
        ///  új ember elkészítése az intézményhez
        /// </summary>
        public void ember_gyartas()
        {
            //emberek létrehozása
            
            Hallgato hallgato = new Hallgato("h1", "hallgato 1", "hh", true, UserTypeEnum.hallgato);
            emberList.Add("h1", hallgato);
            hallgato = new Hallgato("h2", "hallgato 2", "hh", true, UserTypeEnum.hallgato);
            emberList.Add("h2", hallgato);

            Oktato oktato = new Oktato("t1", "oktato 1", "tt", true, UserTypeEnum.oktato);
            emberList.Add("t1", oktato);
            oktato = new Oktato("t2", "oktato 2", "tt", true, UserTypeEnum.oktato);
            emberList.Add("t2", oktato);

            Admin admin = new Admin("a1", "admin 1", "aa", true, UserTypeEnum.administrator);
            emberList.Add("a1", admin);
        }
        */
    }
}